package com.zan.sync;

/**
 * @Author Zan
 * @Create 2024/2/29 12:10
 * @Description :
 */
public class ThreadDemo1 {
    public static void main(String[] args) {
        // 第三步：创建多个线程，调用资源类的操作方法
        Share share = new Share();

        // 创建两个线程
        new Thread(() -> {
            for (int i = 1; i <= 10; i++) {
                try {
                    share.increment();
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        }, "AA").start();

        new Thread(() -> {
            for (int i = 1; i <= 10; i++) {
                try {
                    share.decrement();
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        }, "BB").start();

        new Thread(() -> {
            for (int i = 1; i <= 10; i++) {
                try {
                    share.increment();
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        }, "CC").start();

        new Thread(() -> {
            for (int i = 1; i <= 10; i++) {
                try {
                    share.decrement();
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        }, "DD").start();
    }
}

// 第一步：创建资源类，定义属性和方法
class Share {
    // 初始值
    private int number = 0;

    // +1的方法
    public synchronized void increment() throws InterruptedException {
        // 第二步：判断 干活 通知
        while (number != 0) { // 判断number值是否是0，如果不是0，则等待 (判断)
            this.wait(); // wait()会释放锁，在哪里睡，就会在哪里醒
        }
        // 如果number值是0，就+1操作 (干活)
        number++;
        System.out.println(Thread.currentThread().getName() + " :: " + number);

        // 通知其他线程 (通知)
        this.notifyAll();
    }

    // -1的方法
    public synchronized void decrement() throws InterruptedException {
        // 判断
        while (number != 1) {
            this.wait();
        }

        // 干活
        number--;
        System.out.println(Thread.currentThread().getName() + " :: " + number);

        // 通知其他线程
        this.notifyAll();
    }
}
